AWS CLIでSNS-SQSファンアウトをしてみた。
SNS-SQSファンアウトとは?
ファンアウトの設定を行うと、SNSトピックから発行されたメッセージが複数エンドポイントにプッシュされます。Kinesis Data Firehose 配信ストリーム、Amazon SQS キュー、HTTP (S) エンドポイント、Lambda 関数をエンドポイントとして使用できます。
この記事では、SNSから複数のSQSにファンアウトしてみます。このファンアウトでSNSトピックから発行されたメッセージが複数Amazon SQS キューにプッシュされます。
やってみた
SNS-SQSファンアウトのために、1つのSNSトピック、2つのSQSキュー、および2つのポリシーを作成しました。
- Amazon SNS Topic : メッセージを発行するために、1つのSNSトピック 「SNS-Fanout」。
- Amazon SQS Queue : snsトピックをサブスクライブするための2つのSQSキュー。
- SQS-FanOut-Queue1
- SQS-FanOut-Queue2
- ポリシー : SNS トピックがキューにメッセージを送信できるようにするポリシー。
- policy-queue1.json
- policy-queue2.json
SNSとSQSの作成
- SNSトピック「SNS-Fanout」を作成しておきます。このコマンドはSNSトピックのarnを返します。
aws sns create-topic --name SNS-Fanout --region us-east-1
- 2つのSQSキュー「SQS-FanOut-Queue1、SQS-FanOut-Queue2」を作成しておきます。このコマンドはSQSキューのURLを返します。メッセージを受信するとき、このキューURLを使います。
#Creates Queue 1 aws sqs create-queue --queue-name SQS-FanOut-Queue1 --region us-east-1 #Creates Queue 1 aws sqs create-queue --queue-name SQS-FanOut-Queue2 --region us-east-1
ポリシーを作成
SNS トピックがキューにメッセージを送信できるようにするために、SQSキューにポリシーを追加する必要があります。AWS CLIを使用してポリシーを作成するには、JSONのポリシー(In String Format)が必要です。ローカルでキューごとに1つのポリシーファイルを作成しておきます。
- Queue1のポリシー「policy-queue1.json」
{"Policy" : "{\"Id\": \"id1\",\"Version\": \"2012-10-17\",\"Statement\": [{ \"Sid\": \"Statement1\",\"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"},\"Action\": \"SQS:SendMessage\",\"Resource\": \"arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue1\",\"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout\"}}}]}"}
- Queue2のポリシー「policy-queue2.json」
{"Policy" : "{\"Id\": \"id2\",\"Version\": \"2012-10-17\",\"Statement\": [{ \"Sid\": \"Statement2\",\"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"},\"Action\": \"SQS:SendMessage\",\"Resource\": \"arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue2\",\"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout\"}}}]}"}
- SQSキューにポリシーを追加しておきます。
#Associate policy-1 with queue-1 aws sqs set-queue-attributes --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue1 --attributes file://policy-queue1.json --region us-east-1 #Associate policy-2 with queue-2 aws sqs set-queue-attributes --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue2 --attributes file://policy-queue2.json --region us-east-1
SNSトピックにサブスクライブします
SQSキューをSNSトピックにサブスクライブしておきます。
# Subscribe the queue-1 to the SNS topic aws sns subscribe --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue1 --region us-east-1 # Subscribe the queue-2 to the SNS topic aws sns subscribe --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue2 --region us-east-1
メッセージを送受信
- SNSトピックからのメッセージを送信しておきます。
aws sns publish --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --message "Hello Subscribers" --region us-east-1
- SQSキューにメッセージを受信しておきます。
#Receive Queue1 Message aws sqs receive-message --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue1 --region us-east-1 #Receive Queue2 Message aws sqs receive-message --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue2 --region us-east-1
まとめ
AWS CLIでSNSとSQSファンアウトをしてみました。SNSトピックから発行されたメッセージが複数Amazon SQS キューにプッシュされました。SNSファンアウトはリアルタイムシナリオで使用できます。